1 using System;
2 using
System.Collections.Generic;
3 using
System.Linq;
4 using
System.Text;
5 using
System.Text.RegularExpressions;
6 using
System.Xml;
7 using
System.Xml.Linq;
8
9 using
UnityEditor;
10 using
UnityEngine;
11
12
13 namespace
Tiled2Unity
14 {
15     
// Partial class for the importer that deals with Materials
16     
partial class ImportTiled2Unity
17     {
18         
// We need to call this while the renderers on the model is having its material assigned to it
19         
public Material FixMaterialForMeshRenderer(string objName, Renderer renderer)
20         {
21             
string xmlPath = ImportUtils.GetXmlPath(objName);
22
23             XDocument xml = XDocument.Load(xmlPath);
24
25             
// The mesh to match
26             
string meshName = renderer.name;
27
28             
// The mesh name may be decorated by Unity
29             
string pattern = @"_MeshPart[\d]$";
30             Regex regex =
new Regex(pattern);
31             meshName = regex.Replace(meshName,
"");
32
33             
var assignMaterials = xml.Root.Elements("AssignMaterial");
34
35             
// Find an assignment that matches the mesh renderer
36             XElement match = assignMaterials.FirstOrDefault(el => el.Attribute(
"mesh").Value == meshName);
37
38             
if (match == null)
39             {
40                 
// The names of our meshes in the AssignMaterials elements may be wrong
41                 
// This happened before when Unity replaced whitespace with underscore in our named meshes
42                 
// That case is handled now, but there may be others
43                 StringBuilder builder =
new StringBuilder();
44                 builder.AppendFormat(
"Could not find mesh named '{0}' for material matching\n", renderer.name);
45                 
string choices = String.Join("\n ", assignMaterials.Select(m => m.Attribute("mesh").Value).ToArray());
46                 builder.AppendFormat(
"Choices are:\n {0}", choices);
47
48                 Debug.LogError(builder.ToString());
49                 
return null;
50             }
51
52             
string materialName = match.Attribute("material").Value;
53             
string materialPath = ImportUtils.GetMaterialPath(materialName);
54
55             
// Assign the material
56             renderer.sharedMaterial = AssetDatabase.LoadAssetAtPath(materialPath,
typeof(Material)) as Material;
57
58             
// Set the sorting layer for the mesh
59             
string sortingLayer = match.Attribute("sortingLayerName").Value;
60             
if (!String.IsNullOrEmpty(sortingLayer) && !SortingLayerExposedEditor.GetSortingLayerNames().Contains(sortingLayer))
61             {
62                 Debug.LogError(
string.Format("Sorting Layer \"{0}\" does not exist. Check your Project Settings -> Tags and Layers", sortingLayer));
63                 renderer.sortingLayerName =
"Default";
64             }
65             
else
66             {
67                 renderer.sortingLayerName = sortingLayer;
68             }
69
70             
// Set the sorting order
71             renderer.sortingOrder = ImportUtils.GetAttributeAsInt(match,
"sortingOrder");
72
73             
// Do we have an alpha color key?
74             
string htmlColor = ImportUtils.GetAttributeAsString(match, "alphaColorKey", "");
75             
if (!String.IsNullOrEmpty(htmlColor))
76             {
77                 
// Take for granted color is in the form '#RRGGBB'
78                 
byte r = byte.Parse(htmlColor.Substring(1, 2), System.Globalization.NumberStyles.HexNumber);
79                 
byte g = byte.Parse(htmlColor.Substring(3, 2), System.Globalization.NumberStyles.HexNumber);
80                 
byte b = byte.Parse(htmlColor.Substring(5, 2), System.Globalization.NumberStyles.HexNumber);
81                 Color color =
new Color32(r, g, b, 255);
82                 renderer.sharedMaterial.SetColor(
"_AlphaColorKey", color);
83             }
84
85             
return renderer.sharedMaterial;
86         }
87     }
88 }


Partial class for the importer that deals with Materials

We need to call this while the renderers on the model is having its material assigned to it

The mesh to match

The mesh name may be decorated by Unity

Find an assignment that matches the mesh renderer

The names of our meshes in the AssignMaterials elements may be wrong

This happened before when Unity replaced whitespace with underscore in our named meshes

That case is handled now, but there may be others

Assign the material

Set the sorting layer for the mesh

Set the sorting order

Do we have an alpha color key?

Take for granted color is in the form '#RRGGBB'




Trò chơi đua xe động vật trong UNITY Engine 114.776 lượt xem

Gõ tìm kiếm nhanh...